import handleNum from './index'
const defaultState = {
    // number:hangleNum.state.num   // 这种方式当数据很多的时候，会很复杂，所以使用下面这种方式
    ...handleNum.state,  // 运用展开符NumStatus.state中的元素展开
}
const reducer = (state=defaultState,action:{type:string,val:number})=>{ // val接收的是组件通过dispath操作当前仓库时传递过来的数据
    const newState = JSON.parse(JSON.stringify(state))

    // 如果新添加了一种操作类型，还要在下面添加一个 case，过于麻烦
    /* switch(action.type){    // action.type接收的是组件通过dispath操作当前仓库时传递过来的type动作类型
        case "add1":
            hangleNum.actions.add1(newState)
            break;
        case "add2":
            hangleNum.actions.add2(newState,action)
            break;
        default:
            break;
    }
    */

    // 上面的switch方法过于麻烦，所以可以采取下面这种
    // 下面这种方式的优点在于，如果仓库中新添加了一种操作类型方法，这里就不需要也跟着添加一个case情况
    // 用户通过dispatch传递action.type操作类型名称，我们就跟着这个名称去仓库中寻找对应的操作类型名称，如果找到了就执行对应的操作类型方法
    for(const key in handleNum.actionNames){  // 遍历handleNum仓库中的所以操作类型名称
        // key 是属性名
        // 如果用户要执行的操作类型名称与handleNum仓库中的某个操作类型名称相等
        if(action.type === handleNum.actionNames[key]){
            // 调用handleNum仓库中操作类型名称对应的操作方法
            handleNum.actions[handleNum.actionNames[key]](newState,action)
            break;
        }
    }

    return newState
}

export default reducer